/* eslint-disable no-dupe-keys */
/* eslint-disable no-param-reassign */
/* eslint-disable no-undef */
/* eslint-disable no-shadow */

const config = {
  // #ifdef H5
  baseUrl: '/api',
  // #endif

  // #ifndef H5
  // 这里在H5的环境下，baseUrl会被代理，解决跨域问题
  // 而在不是H5的环境下，会被当做API的基本地址
  baseUrl: 'http://127.0.0.1:3000',
  // #endif
  dataType: 'json',
  showLoading: true,
  loadingText: '请等待...',
  loadingTime: 800,
  originalData: true,
  loadingMask: true,
  header: { 'content-type': 'application/json;charset=UTF-8' },
};

const install = (Vue, vm) => {
  Vue.prototype.$u.http.setConfig(config);

  // 请求拦截部分，每次请求前都会执行
  Vue.prototype.$u.http.interceptor.request = (config) => {
    config.header.Authorization = vm.vuex_token;

    return config;
  };

  Vue.prototype.$u.http.interceptor.response = (raw) => {
    const { statusCode, data: resData, errMsg } = raw;

    // 处理请求不成功的错误
    if (errMsg !== 'request:ok') {
      const wrongTable = {
        'request:fail': '操作失败，请尝试重新操作。可能是网络不通、服务不可用',
        'request:fail timeout': '操作超时，请检查网络，再尝试重新操作',
      };

      if (wrongTable[errMsg]) {
        Vue.prototype.$u.toast(wrongTable[errMsg]);
      } else {
        Vue.prototype.$u.toast(errMsg);
      }

      return false;
    }

    // 处理状态码不为200的情况
    if (statusCode !== 200) {
      // 如果resData不是字符串类型的，建议细化处理，让提示更加人性化
      if (typeof resData === 'string') {
        Vue.prototype.$u.toast(resData);
      } else {
        Vue.prototype.$u.toast(JSON.stringify(resData));
      }
      return false;
    }

    // 处理接口返回错误的情况
    const { code, msg } = resData;
    if (code !== 0) {
      Vue.prototype.$u.toast(msg);
      return false;
    }

    // 没有发生任何错误，返回接口数据
    return resData;
  };
};

export default {
  install,
};
